iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
1
自我挑戰組

Android 菜鳥村-開發基礎 30篇系列 第 7

[Day 5 ] Kotlin class(類別) 與 繼承

  • 分享至 

  • xImage
  •  

本篇文章大概會討論到下列幾個主軸

  • Class 的 語法 , 如何去定義它?

  • 建立 Class 實例(Object) , Object 和 class 的差別

  • Class 的 Constructors

  • initializer blocks

  • Class members

  • Class Inheritance (繼承)

Class 的 語法 , 如何去定義它?

下面是最 基本 的 class , Person 是 這個 Class 的 Name,這個 class 並沒有 Constructor,
當我們並沒有要在 Constructor 傳入 參數,我們可以將 Constructor 省略了


class Person {



}

我們在 Person 後面 加上 Constructor "()"

Constructor 是一種特殊的 function(是這個 class 的 成員),他用來初始化這個 Class 的 新建 Object 的狀態/屬性。創建這個 class 的實例 (Object )時 會調用這個 function 。


class Person() {



}

我們可以在 Constructor 內傳入 我們需要的參數


class Person(name:String , gender:String) {



}

定義 Class 的 成員函數 , 成員屬性

下面我們聲明了 Person 成員屬性(property), 其實說穿了,就只是
在class 內設的變數


class Person(name:String , gender:String) {

val _name:String = ""

val _gender:String = ""


}

下面我們在 class 建立了 Class 的 成員函數 (function) introduce ()


class Person(name:String , gender:String) {

var _name:String = ""

var _gender:String = ""


fun introduce (){

println("My name is $_name")

}


}

建立 Class 實例(Object) , Object 和 class 的差別

下面我們建立了 Person Object ,並讓 person 變數指向這個物件 ,我們將"Tom", "Male" 兩個字串傳給 Constructor 相對應 的 變數 ,"Tom"傳給 name 變數,"Male" 傳給gender 變數


val person = Person ("Tom","Male")

person 指向 Person型別(類別)建立的物件(Object) ,此時 person 會被判定型別(類別)是 Person,這個建立的物件(Object)可以調用 他的 成員函數 和 成員屬性

調用他的 成員函數 introduce ()


fun main (){

person.introduce()

// 對應 它的 introduce 函數 他會 打印出 My name is  , 因為 _name 是空字串 , 
// 還沒有給值


}

調用他的 成員屬性 _name


fun main (){

// 調用他的 成員屬性 _name

val thisPersonName = person._name

// 就像一般變數一樣, 如果是 var 可以指向新的值

person._name = "Jamie"

}

Object 和 class 的差別

在Kotlin中創建 Object 之前,需要定義一個class, class 就像 藍圖 , 而 Object 就像是要依這藍圖建立的房子。 它包含有關 Object 所有詳細信息。基於這些描述,我們建造了 Object 。 由於可以用相同的描述 建立其他的 Object ,因此我們可以根據一個class (BluePrint)創建許多 Object (House) 。

就像 下面 同一個 Person 類別可以建立 好幾個同類別的物件


val person1 = Person ("Adam","Male")

val person2 = Person ("Allan","")

val person3 = Person ("Alvin","")

initializer blocks

Constructor 不能包含任何程式碼。因此,所有初始化邏輯都寫在 init block 內
,因此 init block 內的程式碼 是在 class 初始化階段 便會執行的區塊。


class Person (name:String , gender:String){


var _name:String = ""

var _gender:String = ""

init {

  _name  = name

  _gender  =  gender

}


}

Class 繼承

默認情況下,Class 是 final 並不能被繼承。要使一個類可繼承,需用 open keyword。


open class Bird (){

fun fly (){

println ("I m a bird , I can fly .")

}


下面示範如何繼承一個類別,Seagull 變成 Bird subtype


class Seagull ():Bird(){

 

}

subtype class 可以調用 supertype 的 function

fun main {

 val seagull  =  Seagull ()
 seagull.fly ()
 
 // result :
 // I m a bird , I can fly .
 
}


上面 Seagull () 並無法 複寫 Bird()的 fly function
必須在 fly funtion 也加上 open keyword ,fly
才能被覆寫


open class Bird (){

open fun fly (){

println ("I m a bird , I can fly .")

}


Seagull () 複寫 supertype Bird () 的 function fly ()
複寫 的 fun 要加上 override keyword


class Seagull ():Bird(){

override fun  fly (){

println ("I m a seagull , I can fly .")

}

}



但不是所有的 class 都適合 繼承 , 需要符合 Subtype is Supertype
像上面 Seagull is Bird , Seagull 調用 fly () 是符合常理的
但如果 讓 Cat 類別 繼承 Bird 類別就不符合常理


上一篇
[Day 4] Handler + Runnable Timer 實作
下一篇
[Day 6 ] 迴圈
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言